package com.yfp.group.service;

import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.yfp.group.domain.dto.CreateWxPayOrderDTO;
import com.yfp.group.enums.PayTypeEnums;

public interface PayService {

    /**
     * 创建微信Jsapi预支付订单
     *
     * @param createWxPayOrderDTO
     * @return
     */
    WxPayUnifiedOrderV3Result.JsapiResult createWxJsapiPayOrder(CreateWxPayOrderDTO createWxPayOrderDTO);

    /**
     * 创建微信native预支付订单
     *
     * @param createWxPayOrderDTO
     * @return
     */
    String createWxNativePayOrder(CreateWxPayOrderDTO createWxPayOrderDTO);

    /**
     * 创建余额支付订单
     *
     * @param createWxPayOrderDTO
     */
    void createBalancePayOrder(CreateWxPayOrderDTO createWxPayOrderDTO);

    /**
     * 微信支付回调
     *
     * @param xmlData
     * @return
     */
    String parseOrderNotifyResult(String xmlData);

    /**
     * 微信二维码支付回调
     *
     * @param xmlData
     * @return
     */
    String parseOrderNativeNotifyResult(String xmlData);

    /**
     * 微信退款回调
     *
     * @param xmlData
     * @return
     */
    String parseRefundNotifyResult(String xmlData);

    /**
     * 查询订单状态
     *
     * @param outTradeNo
     * @param subMchId
     * @return
     */
    WxPayPartnerOrderQueryV3Result getOrderStatus(String outTradeNo, String subMchId);

    /**
     * 根据设备id获取子商户号
     *
     * @param machineId
     * @return
     */
    String getSubMchIdByMachineId(String machineId);

    /**
     * 关闭订单
     *
     * @param outTradeNo
     * @param subMchId
     */
    void closeOrder(String outTradeNo, String subMchId);

    /**
     * 根据 订单编号 转换为 outTradeNo
     *
     * @param orderSn      订单编号
     * @param payTypeEnums 支付方式
     * @return 微信支付使用的 outTradeNo
     */
    String orderSnToOutTradeNo(String orderSn, PayTypeEnums payTypeEnums);

    /**
     * 根据 outTradeNo 转换为 订单编号
     *
     * @param outTradeNo 微信订单编号
     * @return 微信支付使用的 outTradeNo
     */
    String outTradeNoToOrderSn(String outTradeNo);
}
